<?php
namespace app\api\controller\v3;


use app\api\controller\v3\TestController;
use app\command\Convert;
use think\App;
use think\console\command\optimize\Schema;
use think\facade\Db;
use crmeb\services\app\MiniProgramService;
class SampleController
{
    private $wx;
    private $wx2;

    /**
     * 构造方法
     */
    public function __construct()
    {
        $this->wx = new TestController(array(
            'appId' => sys_config('routine_appId'),
            'appSecret' => sys_config('pay_weixin_key_v3'),
            'mchId' => sys_config('pay_weixin_mchid_v3'),
            'mchKey' => '<mchKey>',
            'serialNo' => sys_config('pay_weixin_serial_no'),
            'platKey' => '<platKey>',
        ));
        $this->appId = sys_config('routine_appId');
        $this->appSecret = sys_config('pay_weixin_key_v3');
        $this->mchId = sys_config('pay_weixin_mchid_v3');
        $this->serialNo = sys_config('pay_weixin_serial_no');
        $this->fz_jsf = '1463846202';

    }
    /**
     * 上传图片示例
     */
    public function uploadImage()
    {
        $file = ROOT_PATH . 'sample.png';
        $result = $this->wx->upload($file);
        var_dump($result);
    }
    /**
     * 二级商户进件示例
     */
    public function applyment()
    {
        $data = array(
            'out_request_no' => '<内部编号>',
            'organization_type' => '<主体类型>',
            'business_license_info' => array(
                'business_license_copy' => '<上传营业执照得到的MediaID>',
                'business_license_number' => '<营业执照号>',
                'merchant_name' => '<商户名称>',
                'legal_person' => '<法人姓名>',
            ),
            'id_doc_type' => 'IDENTIFICATION_TYPE_MAINLAND_IDCARD',
            'id_card_info' => array(
                'id_card_copy' => '<上传身份证正面得到的MediaID>',
                'id_card_national' => '<上传身份证背面得到的MediaID>',
                'id_card_name' => '<身份证登记姓名>',
                'id_card_number' => '<身份证号>',
                'id_card_valid_time' => '<身份证有效期>',
            ),
            'need_account_info' => true,
            'account_info' => array(
                'bank_account_type' => '<银行账号类型>',
                'account_bank' => '<开户行>',
                'account_name' => '<银行账号开户名>',
                'bank_address_code' => '<开户行地区编号>',
                'bank_name' => '<银行全称>',
                'account_number' => '<银行账号>',
            ),
            'contact_info' => array(
                'contact_type' => '64[|65]',
                'contact_name' => '<超级管理员姓名>',
                'contact_id_card_number' => '<超级管理员身份证号>',
                'mobile_phone' => '<超级管理员手机号>',
                'contact_email' => '<超级管理员电子信箱>',
            ),
            'sales_scene_info' => array(
                'store_name' => '<经营网店名称>',
                'store_url' => '<经营网店URL地址>',
            ),
            'merchant_shortname' => '<商户简称>',
        );
        $result = $this->wx->applyment($data);
        var_dump($result);
    }
    /**
     * 二级商户审核状态查询示例
     */
    public function state()
    {
        $request_no = '202101010000';
        $result = $this->wx->auditState($request_no);
        var_dump($result);
    }
    /**
     * 合单支付示例
     */
    public function combine()
    {
        $data = array(
            'combine_appid' => $this->appId,//'<合单发起方的appid>',
            'combine_mchid' =>$this->mchId,//'<合单发起方的商户号>',
            'combine_out_trade_no' =>time()."zongdan_test20240523" ,//'<合单支付总订单号>',
            'scene_info' => array(
//                'payer_client_ip' => $this->wx->getClientIp(),
                'payer_client_ip' =>$_SERVER["REMOTE_ADDR"],
            ),
            'sub_orders' => array(
                array(
                    'mchid' => $this->mchId,//'<子单发起方的商户号>',
                    'attach' =>"附加数据测试",// '<附加数据>',
                    'amount' => array(
                        'total_amount' => 1,
                        'currency' => 'CNY',
                    ),
                    'out_trade_no' =>"zidan_hedan".time() ,//'<子单商户订单号>',
                    'sub_mchid' => "1653284709",//'<二级商户号>',
                    'description' => "合单测试",//'<商品描述>',
                    'settle_info' => array(
                        'profit_sharing' => true,
                    ),
                ),
            ),
            'combine_payer_info'=>[
                'openid'=>"o8byz64wzNgZ49si-LKlL-o-HaMg",
            ],
            'notify_url' => "https://". $_SERVER['SERVER_NAME'].'/'.'api/notify/wx_notify',
        );
        $result = $this->wx->combine($data);
        var_dump($result);
    }
    /**
     * 添加分账方示例
     */
    public function addReceivers()
    {
        $data = array(
            'type' => 'MERCHANT_ID',
            'account' =>  $this->fz_jsf,
            'name' => '快乐车行（北京）科技有限公司',
            'relation_type' => 'SERVICE_PROVIDER',
            'sub_mchid'=>'1653284709'//微信支付分配的子商户号，即分账的出资商户号。
        );
//        $data = array(
//            'type' => 'PERSONAL_OPENID',
//            'account' => "oBDvo5M3WqQJeW2_LnN2ZZ_-FfUs",
//            'name' => '陈彪',
//            'relation_type' => 'USER',
//        );
        $result = $this->wx->addReceivers($data);
        return $result;
    }
    /**
     * 删除分账方示例
     */
    public function delReceivers()
    {
        $data = array(
            'type' => 'MERCHANT_ID',
            'account' => $this->mchId,
            'name' => '湖南快乐车行露营地投资发展有限公司',
            'relation_type' => 'SERVICE_PROVIDER',
            'sub_mchid'=>'1653284709'//微信支付分配的子商户号，即分账的出资商户号。
        );
        $result = $this->wx->delReceivers($data);
        return $result;
    }
    /**
     * 分账
     */
    public function divide($order)
    {
        //查询分账子商户信息
        $wx_applyment = Db::name('wx_applyment')->where('id',$order['vendorid'])->find();
        if(!$wx_applyment) return app('json')->fail('服务器请求不正确');
        $amount = $order['amount'];
        $data = array(
            'sub_mchid'=>$wx_applyment['mchid'],//微信支付分配的子商户号，即分账的出资商户号。
            'transaction_id' => $order["transaction_id"],
            'out_order_no' => $order['out_order_no'],
            'unfreeze_unsplit'=>false,
            'receivers' => array(
                array(
                    'type' => 'MERCHANT_ID',
                    'account' => $this->fz_jsf,//接收方
                    'amount' => (int)$amount,//以分为单位
                    'description' => $order['out_order_no']."订单分账",
                ),
            ),
            'finish' => true,
        );
        $result =$this->wx->divide($data);
        return $result;
    }

    /**
     * 分账回退
     */
    public function return_divide($order)
    {
        //查询分账子商户信息
        $wx_applyment = Db::name('wx_applyment')->where('id',$order['vendorid'])->find();
        if(!$wx_applyment) return app('json')->fail('服务器请求不正确');
        $data = array(
            'sub_mchid'=>$wx_applyment['mchid'],//【子商户号】 分账回退的接收商户，对应原分账出资的分账方商户，填写微信支付分配的商户号。（直连商户不需要，服务商需要）
            'out_order_no' => $order['out_order_no'],//【商户分账单号】 商户系统内部的分账单号，在商户系统内部唯一，同一分账单号多次请求等同一次。微信分账单号和商户分账单号二选一填写 取值范围：[0-9a-zA-Z_*@-]
            'out_return_no'=>$order['out_return_no'],//【商户回退单号】 此回退单号是商户在自己后台生成的一个新的回退单号，在商户后台唯一
            'return_mchid'=>$this->fz_jsf,//【回退商户号】 分账回退的出资商户，只能对原分账请求中成功分给商户接收方进行回退
            'amount' =>$order['amount'],//【回退金额】 需要从分账接收方回退的金额，单位为分，只能为整数，不能超过原始分账单分出给该接收方的金额
            'description'=>"分账回退"
        );
        $result =$this->wx->return_divide($data);
        return $result;
    }

    /**
     * 解冻剩余资金
     */
    public function unfreeze()
    {
        $order = Db::name('car_order')->where('id',250)->find();
        $data = array(
            'transaction_id' => $order["out_trade_no"],
            'out_order_no' => $order['order_no'],
            'description'=>"分账的原因描述，分账账单中需要体现"
        );
        $result =$this->wx->unfreeze($data);
        p($result);exit;

        return $result;
    }

    /**
     * 查询剩余待分金额
     */
    public function get_daifen_amounts(){
        $order = Db::name('car_order')->where('id',344)->find();
        $data = array(
            'transaction_id' => $order["out_trade_no"],
        );
        $result =$this->wx->get_daifen_amounts($data);
        return $result;
    }

    /**
     * 查询分账结果API
     */
    public function get_split_result(){
        $order = Db::name('car_order')->where('id',250)->find();
        $data = array(
        'sub_mchid' => '1653284709',
        'transaction_id' => $order["out_trade_no"],
        'out_order_no' => $order['order_no'],
        );
        $result =$this->wx->get_split_result($data);
        return $result;
    }
    /**
     * 微信退款
     */
    public function wx_tui(){
        $orderInfo = Db::name('car_order')->where('id',4)->find();
        $tui_fee = 4;//车辆租金
        $totalFee = $orderInfo['price']*100;//订单总金额
        $out_refund_no = time().$orderInfo['order_no'];//系统内部退款订单号，这里用deposit标识是车辆押金加上订单号
        $wxpay = new WxPayController();
        $ok2 = $wxpay->wx_refund($orderInfo['out_trade_no'],0,$totalFee,$tui_fee,0,0,0,$out_refund_no);
        p($ok2);exit;
        if($ok2['code']==1){
            Db::name('car_order')->where('id',$orderInfo['id'])->update(['it_illegal_deposit'=>1]);
        }
    }

    /**
     * 微信退款2 用于直连商户退款
     */
    public function wx_tui2(){
        $orderInfo = Db::name('car_order')->where('id',3)->find();
        $tui_fee =0.6;//车辆租金
        $totalFee = $orderInfo['price'];//订单总金额
        $out_refund_no = time().$orderInfo['order_no'];//系统内部退款订单号，这里用deposit标识是车辆押金加上订单号
        $refundData = [
            'pay_price'=>$totalFee,//订单总价
            'refund_price'=>$tui_fee,//要退的钱
            'refund_no'=>$out_refund_no,//退款单号
            'type'=>'trade_no',//退款类型
            'refund_id'=>$out_refund_no,
            'order_id'=>$orderInfo['id']
        ];
        $ok2 = MiniProgramService::payOrderRefund2($orderInfo['out_trade_no'], $refundData);//小程序
        p($ok2);exit;
    }

    /**
     * 微信支付订单号查询订单 服务商版本
     */
    public function get_order(){
        $data = Db::name('car_order')->where('id',3)->find();
        $result =$this->wx->get_order($data);
        p($result);exit;
    }
    /**
     * 微信支付订单号查询订单 直营商户版本
     */
    public function get_order2(){
        $data = Db::name('car_order')->where('id',1)->find();
        $result =$this->wx->get_order2($data);
        p($result);exit;
    }


}